home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Business, Office & Collaboration / Chandler 1.0.2 / Chandler_win_1.0.2.exe / Chandler.py < prev    next >
Text File  |  2008-09-24  |  7KB  |  173 lines

  1. #   Copyright (c) 2003-2008 Open Source Applications Foundation
  2. #
  3. #   Licensed under the Apache License, Version 2.0 (the "License");
  4. #   you may not use this file except in compliance with the License.
  5. #   You may obtain a copy of the License at
  6. #
  7. #       http://www.apache.org/licenses/LICENSE-2.0
  8. #
  9. #   Unless required by applicable law or agreed to in writing, software
  10. #   distributed under the License is distributed on an "AS IS" BASIS,
  11. #   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. #   See the License for the specific language governing permissions and
  13. #   limitations under the License.
  14.  
  15.  
  16. """
  17. Chandler startup
  18. """
  19.  
  20. import os, sys
  21. from application import Globals, Utility
  22.  
  23. def main():
  24.  
  25.     # Process any command line switches and any environment variable values
  26.     Globals.options = Utility.initOptions()
  27.  
  28.     def realMain():
  29.         
  30.         from application import feedback
  31.         feedback.initRuntimeLog(Globals.options.profileDir)
  32.         
  33.         Globals.chandlerDirectory = Utility.locateChandlerDirectory()
  34.     
  35.         os.chdir(Globals.chandlerDirectory)
  36.         Utility.initLogging(Globals.options)
  37.  
  38.         if __debug__ and Globals.options.wing:
  39.             # Check for -wing command line argument; if specified, try to 
  40.             # connect to an already-running WingIDE instance. See
  41.             # http://wiki.osafoundation.org/bin/view/Chandler/DebuggingChandler#wingIDE
  42.             # for details.
  43.  
  44.             import wingdbstub
  45.  
  46.         if __debug__ and Globals.options.komodo:
  47.             # Check for -komodo command line argument; if specified, try to 
  48.             # connect to an already-running Komodo instance. See
  49.             # http://wiki.osafoundation.org/bin/view/Chandler/DebuggingChandler#Komodo
  50.             # for details.
  51.  
  52.             import dbgp.client
  53.             dbgp.client.brk()
  54.  
  55.         from application.Application import wxApplication
  56.  
  57.         # Redirect stdio and stderr to a dialog if a non-default --catch option 
  58.         # was specified. This is done to catch asserts, which otherwise will
  59.         # never get seen by people who run Chandler using the launchers, e.g.
  60.         # Aparna. If you're running release you can also set things up so 
  61.         # that you can see stderr and stdout if you run in a shell or from
  62.         # wing with a console.
  63.         redirect = Globals.options.catch == 'normal'
  64.         
  65.         # useBestVisual: See wxApp.SetUseBestVisual (Only applicable
  66.         # for X-Windows based systems) On some older computers the
  67.         # default visual may only have a depth of 8 although 24-bit
  68.         # visuals are available. (SGI is notorious for this.) Setting
  69.         # this to True will cause the best visual to be used instead.
  70.         # Unfortunatly on some systems with a 32-bit visual available
  71.         # this can cause problems if the default GTK theme expects to
  72.         # use only 24.  (See Bug #9295) So for now we'll default this
  73.         # to False.  If this becomes a problem in the future then we
  74.         # should add a command-line option for it or perhaps find a
  75.         # way to detect if the display depth is < 24.  (Note there is
  76.         # a chicken-and-egg problem with wx.GetDisplayDepth() as it
  77.         # needs to have the app created before it can be called.)
  78.         useBestVisual = False
  79.         
  80.         app = wxApplication(redirect=redirect, useBestVisual=useBestVisual)
  81.  
  82.         exitValue = getattr(app, 'exitValue', 0)
  83.         if exitValue:
  84.             return exitValue
  85.  
  86.         app.MainLoop()
  87.  
  88.         return getattr(app, 'exitValue', 0)
  89.  
  90.     if Globals.options.catch != 'normal':
  91.         # When debugging, it's handy to run without the outer exception frame
  92.         return realMain()
  93.     else:
  94.         try:
  95.             # The normal way: wrap the app in an exception frame
  96.             from chandlerdb.persistence.RepositoryError \
  97.                 import RepositoryOpenDeniedError, ExclusiveOpenDeniedError
  98.  
  99.             import logging, wx
  100.             from i18n import ChandlerSafeTranslationMessageFactory as _
  101.             return realMain()
  102.  
  103.         except (RepositoryOpenDeniedError, ExclusiveOpenDeniedError):
  104.             # This doesn't seem worth the effor to localize, since we don't have a repository
  105.             # which is necessary for localization.
  106.             try:
  107.                 logging.error("Another instance of Chandler currently has the repository open.")
  108.                 dialog = wx.MessageDialog(None,
  109.                                           _(u"Another Chandler is already running off the same data repository."),
  110.                                           u"Chandler", wx.OK | wx.ICON_INFORMATION)
  111.                 dialog.ShowModal()
  112.                 dialog.Destroy()
  113.             finally:
  114.                 return 1
  115.  
  116.         except Utility.SchemaMismatchError:
  117.             try:
  118.                 logging.info("User chose not to clear the repository.  Exiting.")
  119.             finally:
  120.                 return 1
  121.  
  122.         except:
  123.             try:
  124.                 import traceback
  125.                 
  126.                 line1 = "Chandler encountered an unexpected problem while trying to start.\n"
  127.                 
  128.                 type, value, stack = sys.exc_info()
  129.                 backtrace = traceback.format_exception(type, value, stack)
  130.                 
  131.                 longMessage = "".join([line1, "\n"] + backtrace)
  132.                 
  133.                 logging.error(longMessage)
  134.                 
  135.                 if getattr(globals(), 'app', None) is None or wx.GetApp() is None:
  136.                     app = wx.PySimpleApp()
  137.                     app.ignoreSynchronizeWidget = True
  138.                 
  139.                 try:
  140.                     # Let's try the best (and most complicated) option
  141.                     # first
  142.                     # See if we already have a window up, and if so, reuse it
  143.                     from application import feedback
  144.                     feedback.destroyAppOnClose = True
  145.                     win = feedback.FeedbackWindow()
  146.                     win.CreateOutputWindow('')
  147.                     for line in backtrace:
  148.                         win.write(line)
  149.                     if not app.IsMainLoopRunning():
  150.                         app.MainLoop()
  151.                 except:
  152.                     # Fall back to our custom (but simple) error dialog
  153.                     try:
  154.                         from application.dialogs.UncaughtExceptionDialog import ErrorDialog
  155.                         dialog = ErrorDialog(longMessage)
  156.                     except:
  157.                         # Fall back to MessageDialog
  158.                         frames = 8
  159.                         line = _(u"Start up error.\nHere are the bottom %(numOf)s frames of the stack: %(stacktrace)s\n\n") % {'numOf': frames - 1, "stacktrace": unicode("".join(backtrace[-frames:]), "UTF-8", "ignore")}
  160.                         dialog = wx.MessageDialog(None, line, u"Chandler", wx.OK | wx.ICON_INFORMATION)
  161.                     dialog.ShowModal()
  162.                     dialog.Destroy()
  163.             finally:
  164.                 return 1
  165.  
  166.     #@@@Temporary testing tool written by Morgen -- DJA
  167.     #import util.timing
  168.     #print "\nTiming results:\n"
  169.     #util.timing.results()
  170.  
  171. if __name__== "__main__":
  172.     sys.exit(main())
  173.